/**
 * 
 */
package db;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.Artikel;
import model.DownloadArtikel;
import model.Lagerartikel;

/**
 * @author spiller.sebastian
 *
 */
public class ArtikelBuilder implements ArtikelSource {
	
	private static DbManager DbManagerInstance = DbManager.getInstance();
	private static ArtikelBuilder ArtikelBuilderInstance;
	private List<Artikel> cachedListArtikel = null;
	
	private ArtikelBuilder(){
	}
	
	/**
	 * @return
	 */
	public static ArtikelBuilder getInstance() {
		if (ArtikelBuilder.ArtikelBuilderInstance == null) {
			ArtikelBuilder.ArtikelBuilderInstance = new ArtikelBuilder();
		}
		return ArtikelBuilder.ArtikelBuilderInstance;
	}

	/* (non-Javadoc)
	 * @see db.ArtikelSource#getAllArtikel()
	 */
	public List<Artikel> getAllArtikel() {
		
		if (cachedListArtikel != null && !cachedListArtikel.isEmpty()) {
			return cachedListArtikel;
		}
		
		try {
			
			ResultSet rs = DbManagerInstance.getCon().createStatement()
				.executeQuery("SELECT * FROM t_artikel" +
					" LEFT JOIN t_downloadartikel ON artikelnummer = t_downloadartikel.artikel_id " +
					" LEFT JOIN t_lagerartikel ON artikelnummer = t_lagerartikel.artikel_id");
			
			
			List<Artikel> listArtikel= new ArrayList<Artikel>();

			while (rs.next()) {
				
				if (rs.getString("lagerort") == null || rs.getString("lagerort").isEmpty()) {
					
					DownloadArtikel artikel = new DownloadArtikel(
						rs.getInt("artikelnummer"),
						rs.getString("bezeichnung"),
						rs.getDouble("listenpreis"),
						rs.getString("key"),
						rs.getString("downloadgroesse"),
						rs.getString("dateiname"));
					
					listArtikel.add(artikel);
				}
				else {
					Lagerartikel artikel = new Lagerartikel(
						rs.getInt("artikelnummer"),
						rs.getString("bezeichnung"),
						rs.getDouble("listenpreis"),
						rs.getString("lagerort"),
						rs.getLong("anzahl"));
					
					listArtikel.add(artikel);
				}
			}
			cachedListArtikel = listArtikel;
			return listArtikel;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see db.ArtikelSource#add(model.Artikel)
	 */
	public void add(Artikel artikel) {
		
		try {
			ResultSet rs = DbManagerInstance.getCon().createStatement()
				.executeQuery("INSERT INTO t_artikel" +
					" (artikelnummer, bezeichnung, listenpreis) VALUES (" +
					String.valueOf(artikel.getArtikelnr()) + "," +
					artikel.getBezeichnung() + "," +
					String.valueOf(artikel.getListenpreis()) + ")");
			}	
			 catch (SQLException e) {
				e.printStackTrace();
			}
	}
	
	/* (non-Javadoc)
	 * @see db.ArtikelSource#update(model.Artikel)
	 */
	public void update(Artikel artikel) {
		// TODO Next iteration: Save new Artikel
	}
	
	/* (non-Javadoc)
	 * @see db.ArtikelSource#remove(model.Artikel)
	 */
	public void remove(Artikel artikel) {
		// TODO Next iteration: Save new Artikel
	}

	public Artikel getArtikel(int artikelnummer) {
		
		List<Artikel> listArtikel = this.getAllArtikel();
		if(listArtikel != null){
			for(Artikel artikel : listArtikel) {
				if ( artikel.getArtikelnr() == artikelnummer){
					return artikel;
				}
			}
		}
		return null;
	}
}